package com.aote.model;

import java.util.Hashtable;
import java.util.LinkedList;
import javax.servlet.http.HttpServletRequest;
import com.browsesoft.Entity;
import com.browsesoft.EntityManager;

public class DoStockCancelAction implements Action {

	private Entity entity = null;

	public void doAction(HttpServletRequest request) {
		// 根据id得到历史库存实体
		String id = request.getParameter("id");
		entity = (Entity) EntityManager.getInstance().getObject(id);
		// 做撤销动作
		doCancel(entity);
	}

	/**
	 * 撤销处理
	 */
	private void doCancel(Entity entity) {
		try {
			// 得到状态
			String state = (String) entity.getAttributes().get("f_state");
			// 根据parentid得到父实体
			String parentId = (String) entity.getAttributes().get("parentid");
			Entity parent = (Entity) EntityManager.getInstance().getObject(
					parentId);
			if (state.equals("添加")) {
				doAddCancel(entity, parent);
			} else if (state.equals("入库")) {
				doPutInCancel(entity, parent);
			} else if (state.equals("出库")) {
				doGetOutCancel(entity, parent);
			} else if (state.equals("盘点")) {
				doCheckCancel(entity, parent);
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 撤销添加
	 */
	private void doAddCancel(Entity entity, Entity parent) throws Exception {
		parent.delete();
		entity.delete();
	}

	/**
	 * 入库撤销
	 */
	private void doPutInCancel(Entity entity, Entity parent) throws Exception {
		// 根据名称得到物品实体
		String name = (String) entity.getAttributes().get("f_wupin");
		Entity wupin = getWupinEntity(name);
		// 根据库存实体中得数量更新物品实体中得数量
		String number = (String) entity.getAttributes().get("f_oldamount");
		wupin.getAttributes().put("f_repertorynumber", number);
		wupin.update();
		// 删除库存记录，入库记录
		entity.delete();
		parent.delete();
	}

	/**
	 * 盘点
	 */
	private void doCheckCancel(Entity entity, Entity parent) throws Exception {
		// 根据名称得到物品实体
		String name = (String) entity.getAttributes().get("f_wupin");
		Entity wupin = getWupinEntity(name);
		// 根据库存实体中得数量更新物品实体中得数量
		String number = (String) entity.getAttributes().get("f_oldamount");
		wupin.getAttributes().put("f_repertorynumber", number);
		wupin.update();
		// 删除库存记录，入库记录
		entity.delete();
		parent.delete();
	}

	/**
	 * 出库撤销
	 */
	private void doGetOutCancel(Entity entity, Entity parent) throws Exception {
		// 根据名称得到物品实体
		String name = (String) entity.getAttributes().get("f_wupin");
		Entity wupin = getWupinEntity(name);
		// 根据库存实体中得数量更新物品实体中得数量
		String number = (String) entity.getAttributes().get("f_oldamount");
		wupin.getAttributes().put("f_repertorynumber", number);
		wupin.update();
		// 删除库存记录，出库记录
		entity.delete();
		parent.delete();
	}

	/**
	 * 根据物品名称得到物品实体
	 */
	private Entity getWupinEntity(String name) throws Exception {
		Hashtable ht = new Hashtable();
		ht.put("entitytype", "goodsmaintenance");
		ht.put("f_goodsname", name);
		LinkedList list = EntityManager.getInstance().getObjects(
				"com.browsesoft.baseadapter.SimpleEntity", ht);
		return (Entity) list.get(0);
	}

}
